home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / AEWIN100.ARJ / KEYBD.CC < prev    next >
C/C++ Source or Header  |  1990-12-24  |  7KB  |  243 lines

  1. /**********************************************************************
  2.  *  
  3.  *  NAME:           keybd.cpp
  4.  *  
  5.  *  DESCRIPTION:    keyboard interface
  6.  *  
  7.  *  copyright (c) 1990 J. Alan Eldridge
  8.  * 
  9.  *  M O D I F I C A T I O N   H I S T O R Y
  10.  *
  11.  *  when        who                 what
  12.  *  -------------------------------------------------------------------
  13.  *  08/14/90    J. Alan Eldridge    created
  14.  *  
  15.  *********************************************************************/
  16.  
  17. #include    "w.h"
  18.  
  19. //  defines for PC keyboard BIOS return values
  20.  
  21. #define FUNC_1      59
  22. #define FUNC_1S     84
  23. #define FUNC_1C     94
  24. #define FUNC_1A     104
  25. #define FUNC_11     133
  26. #define FUNC_11S    135
  27. #define FUNC_11C    137
  28. #define FUNC_11A    139
  29.  
  30. #define NULL_CHAR   3
  31.  
  32. #define SHIFT_TAB   15
  33.  
  34. #define ALT_Q       16
  35. #define ALT_W       17
  36. #define ALT_E       18
  37. #define ALT_R       19
  38. #define ALT_T       20
  39. #define ALT_Y       21
  40. #define ALT_U       22
  41. #define ALT_I       23
  42. #define ALT_O       24
  43. #define ALT_P       25
  44.  
  45. #define ALT_A       30
  46. #define ALT_S       31
  47. #define ALT_D       32
  48. #define ALT_F       33
  49. #define ALT_G       34
  50. #define ALT_H       35
  51. #define ALT_J       36
  52. #define ALT_K       37
  53. #define ALT_L       38
  54.  
  55. #define ALT_Z       44
  56. #define ALT_X       45
  57. #define ALT_C       46
  58. #define ALT_V       47
  59. #define ALT_B       48
  60. #define ALT_N       49
  61. #define ALT_M       50
  62.  
  63. #define HOME        71
  64. #define UP          72
  65. #define PGUP        73
  66. #define LEFT        75
  67. #define RIGHT       77
  68. #define ENDKEY      79
  69. #define DOWN        80
  70. #define PGDN        81
  71. #define INSRT       82
  72. #define DEL         83
  73.  
  74. #define C_PRTSC     114
  75. #define C_LEFT      115
  76. #define C_RIGHT     116
  77. #define C_END       117
  78. #define C_PGDN      118
  79. #define C_HOME      119
  80.  
  81. #define ALT_1       120
  82.  
  83. #define ALT_MINUS   130
  84. #define ALT_EQUAL   131
  85. #define C_PGUP      132
  86.  
  87. //  lookup table to map from BIOS to my key representation
  88.  
  89. typedef struct {
  90.     uchar   biosval;
  91.     int     newval;
  92. } KEY_DEF;
  93.  
  94. #define NELEMS(arr) (sizeof(arr)/sizeof(arr[0]))
  95.  
  96. static KEY_DEF  keytable[] = {
  97.     //  unmodified keys
  98.     { NULL_CHAR,    K_NUL   },
  99.     { FUNC_1,       K_F1    },
  100.     { FUNC_1 + 1,   K_F2    },
  101.     { FUNC_1 + 2,   K_F3    },
  102.     { FUNC_1 + 3,   K_F4    },
  103.     { FUNC_1 + 4,   K_F5    },
  104.     { FUNC_1 + 5,   K_F6    },
  105.     { FUNC_1 + 6,   K_F7    },
  106.     { FUNC_1 + 7,   K_F8    },
  107.     { FUNC_1 + 8,   K_F9    },
  108.     { FUNC_1 + 9,   K_F10   },
  109.     { FUNC_11,      K_F11   },
  110.     { FUNC_11 + 1,  K_F12   },
  111.     { HOME,         K_HOME  },
  112.     { UP,           K_UP    },
  113.     { PGUP,         K_PGUP  },
  114.     { LEFT,         K_LEFT  },
  115.     { RIGHT,        K_RIGHT },
  116.     { ENDKEY,       K_END   },
  117.     { DOWN,         K_DOWN  },
  118.     { PGDN,         K_PGDN  },
  119.     { INSRT,        K_INS   },
  120.     { DEL,          K_DEL   },
  121.     //  shift key down
  122.     { FUNC_1S,      K_F1 | K_SHIFT  },
  123.     { FUNC_1S + 1,  K_F2 | K_SHIFT  },
  124.     { FUNC_1S + 2,  K_F3 | K_SHIFT  },
  125.     { FUNC_1S + 3,  K_F4 | K_SHIFT  },
  126.     { FUNC_1S + 4,  K_F5 | K_SHIFT  },
  127.     { FUNC_1S + 5,  K_F6 | K_SHIFT  },
  128.     { FUNC_1S + 6,  K_F7 | K_SHIFT  },
  129.     { FUNC_1S + 7,  K_F8 | K_SHIFT  },
  130.     { FUNC_1S + 8,  K_F9 | K_SHIFT  },
  131.     { FUNC_1S + 9,  K_F10 | K_SHIFT },
  132.     { FUNC_11S,     K_F11 | K_SHIFT },
  133.     { FUNC_11S + 1, K_F12 | K_SHIFT },
  134.     { SHIFT_TAB,    K_BACKTAB       },
  135.     //  alt key down
  136.     { FUNC_1A,      K_F1 | K_ALT    },
  137.     { FUNC_1A + 1,  K_F2 | K_ALT    },
  138.     { FUNC_1A + 2,  K_F3 | K_ALT    },
  139.     { FUNC_1A + 3,  K_F4 | K_ALT    },
  140.     { FUNC_1A + 4,  K_F5 | K_ALT    },
  141.     { FUNC_1A + 5,  K_F6 | K_ALT    },
  142.     { FUNC_1A + 6,  K_F7 | K_ALT    },
  143.     { FUNC_1A + 7,  K_F8 | K_ALT    },
  144.     { FUNC_1A + 8,  K_F9 | K_ALT    },
  145.     { FUNC_1A + 9,  K_F10 | K_ALT   },
  146.     { FUNC_11A,     K_F11 | K_ALT   },
  147.     { FUNC_11A + 1, K_F12 | K_ALT   },
  148.     { ALT_A,        'a' | K_ALT     },
  149.     { ALT_B,        'b' | K_ALT     },
  150.     { ALT_C,        'c' | K_ALT     },
  151.     { ALT_D,        'd' | K_ALT     },
  152.     { ALT_E,        'e' | K_ALT     },
  153.     { ALT_F,        'f' | K_ALT     },
  154.     { ALT_G,        'g' | K_ALT     },
  155.     { ALT_H,        'h' | K_ALT     },
  156.     { ALT_I,        'i' | K_ALT     },
  157.     { ALT_J,        'j' | K_ALT     },
  158.     { ALT_K,        'k' | K_ALT     },
  159.     { ALT_L,        'l' | K_ALT     },
  160.     { ALT_M,        'm' | K_ALT     },
  161.     { ALT_N,        'n' | K_ALT     },
  162.     { ALT_O,        'o' | K_ALT     },
  163.     { ALT_P,        'p' | K_ALT     },
  164.     { ALT_Q,        'q' | K_ALT     },
  165.     { ALT_R,        'r' | K_ALT     },
  166.     { ALT_S,        's' | K_ALT     },
  167.     { ALT_T,        't' | K_ALT     },
  168.     { ALT_U,        'u' | K_ALT     },
  169.     { ALT_V,        'v' | K_ALT     },
  170.     { ALT_W,        'w' | K_ALT     },
  171.     { ALT_X,        'x' | K_ALT     },
  172.     { ALT_Y,        'y' | K_ALT     },
  173.     { ALT_Z,        'z' | K_ALT     },
  174.     { ALT_1,        '1' | K_ALT     },
  175.     { ALT_1 + 1,    '2' | K_ALT     },
  176.     { ALT_1 + 2,    '3' | K_ALT     },
  177.     { ALT_1 + 3,    '4' | K_ALT     },
  178.     { ALT_1 + 4,    '5' | K_ALT     },
  179.     { ALT_1 + 5,    '6' | K_ALT     },
  180.     { ALT_1 + 6,    '7' | K_ALT     },
  181.     { ALT_1 + 7,    '8' | K_ALT     },
  182.     { ALT_1 + 8,    '9' | K_ALT     },
  183.     { ALT_1 + 9,    '0' | K_ALT     },
  184.     { ALT_MINUS,    '-' | K_ALT     },
  185.     { ALT_EQUAL,    '=' | K_ALT     },
  186.     //  control key down
  187.     { FUNC_1C,      K_F1 | K_CTL    },
  188.     { FUNC_1C + 1,  K_F2 | K_CTL    },
  189.     { FUNC_1C + 2,  K_F3 | K_CTL    },
  190.     { FUNC_1C + 3,  K_F4 | K_CTL    },
  191.     { FUNC_1C + 4,  K_F5 | K_CTL    },
  192.     { FUNC_1C + 5,  K_F6 | K_CTL    },
  193.     { FUNC_1C + 6,  K_F7 | K_CTL    },
  194.     { FUNC_1C + 7,  K_F8 | K_CTL    },
  195.     { FUNC_1C + 8,  K_F9 | K_CTL    },
  196.     { FUNC_1C + 9,  K_F10 | K_CTL   },
  197.     { FUNC_11C,     K_F11 | K_CTL   },
  198.     { FUNC_11C + 1, K_F12 | K_CTL   },
  199.     { C_PRTSC,      K_PRTSC | K_CTL },
  200.     { C_LEFT,       K_LEFT  | K_CTL },
  201.     { C_RIGHT,      K_RIGHT | K_CTL },
  202.     { C_END,        K_END   | K_CTL },
  203.     { C_PGDN,       K_PGDN  | K_CTL },
  204.     { C_HOME,       K_HOME  | K_CTL },
  205.     { C_PGUP,       K_PGUP  | K_CTL }
  206. };
  207.     
  208. //  get a character and return virtual keycode
  209.  
  210. #define IsExtendedKey(c)    (!(c)||(c)==0xE0)
  211.  
  212. int
  213. kbd_getkey()
  214. {
  215.     uchar   c;
  216.     
  217.     c = getch();
  218.     if (IsExtendedKey(c)) {
  219.         c = getch();
  220.         for (int n = 0; n < NELEMS(keytable); n++)
  221.             if (keytable[n].biosval == c)
  222.                 return keytable[n].newval;
  223.  
  224.         return K_UNKNOWN;
  225.     } else
  226.         return c == K_CR ? K_NL : c;
  227. }
  228.  
  229. //  is a particular key in an array?
  230.  
  231. int
  232. findkey(
  233.     int *arr,
  234.     int key)
  235. {
  236.     for (int n = 0; arr[n] != K_ILLEGAL; n++)
  237.         if (arr[n] == key) 
  238.             return TRUE;
  239.  
  240.     return FALSE;
  241. }
  242.     
  243.